1. 修改项目的settings的配置

  • 在 settings.py 中配置需要连接的多个数据库

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'db_mysql': {
        "ENGINE": "django.db.backends.mysql",  # django.db.backends.所连接的数据库
        "NAME": "test_db",  # 数据库名称
        "USER": "root",  # 数据库用户名
        "PASSWORD": "",  # 数据库密码
        "HOST": "127.0.0.1",  # 数据库IP,如果是连接本机的可以直接填写 127.0.0.1 或 localhost
        "POST": 3306  # 数据库端口号
    }
}

2. 设置数据库的路由规则

  • 如果不设置当某个视图使用了orm并且访问了该视图,那么就会出现报错


# database_router.py

from django.conf import settings

DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING


class DatabaseAppsRouter(object):
"""
    A router to control all database operations on models for different
    databases.

    In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
    will fallback to the `default` database.

    Settings example:

    DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
    """

    def db_for_read(self, model, **hints):
""""Point all read operations to the specific database."""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):
"""Point all write operations to the specific database."""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):
"""Allow any relation between apps that use the same database."""
        db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
        db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
        if db_obj1 and db_obj2:
            if db_obj1 == db_obj2:
                return True
            else:
                return False
        return None

    def allow_syncdb(self, db, model):
"""Make sure that apps only appear in the related database."""
        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(model._meta.app_label) == db
        elif model._meta.app_label in DATABASE_MAPPING:
            return False
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
"""
        Make sure the auth app only appears in the 'auth_db'
        database.
        """
        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(app_label) == db
        elif app_label in DATABASE_MAPPING:
            return False
        return None

# settings.py

# DATABASE_ROUTERS = ['项目文件夹.database_router.DatabaseAppsRouter']

DATABASE_ROUTERS = ['test_dblj.database_router.DatabaseAppsRouter']

3.设置APP所对应的数据库

# settings.py

DATABASE_APPS_MAPPING = {
# 'app_name':'DATABASES配置项中所定义的数据库名',
    'app01': 'default',
    'app02': 'db_mysql',
}

4.创建表

# app01/models.py

from django.db import models


class UserA(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField(null=True)

    class Meta:
# app_label = 'app的名字'
app_label = 'app01' # 一定要设置 app_label,因为在执行 migrate 的时候会通过 app_label 所设置的 app_name 找到它所对应的数据,如果不设置默认创建到 settings -> DATABASES -> default 所配置的数据库下

# 终端所执行的代码

python manage.py makemigrations app01  记录 app01 下 models.py 中所改动的内容

# 或

python manage.py makemigrations  # 记录所有 app 下 models.py 中所改动的内容

# 终端所执行的代码

python manage.py migrate app01 --database default  # 默认只会创建 django_migrations 和 你所定义的表,django_session、django_content_type 等都不会创建

# 如果当前app所使用的数据库是default,那么就要执行下面的代码,不能执行上面的代码

python manage.py migrate  只在default数据库下创建 你所定义的表 和 django_session、django_content_type 等表



# app02/models.py

from django.db import models


class UserB(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField(null=True)

    class Meta:
# app_label = 'app的名字'
app_label = 'app02'  # 一定要设置 app_label,因为在执行 migrate 的时候会通过 app_label 所设置的 app_name 找到它所对应的数据,如果不设置默认创建到 settings -> DATABASES -> default 所配置的数据库下

# 终端所执行的代码

python manage.py makemigrations app02  # 记录 app02 下 models.py 中所改动的内容

# 或

python manage.py makemigrations  # 记录所有 app 下 models.py 中所改动的内容

# 终端所执行的代码

python manage.py migrate app02 --database db_mysql  # 默认只会创建 django_migrations 和 你所定义的表,django_session、django_content_type 等都不会创建